#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 270005
#define mod 998244353
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
const int INF=1e9;
int qpow(int a,int b){
	int res=1;
	while(b){
		if(b&1) res=res*a%mod;
		a=a*a%mod;b>>=1;
	}
	return res;
}
/*
int fac[N],ifac[N];
int C(int n,int m){
	if(n<m||n<0||m<0) return 0;
	return fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
void init(){
	fac[0]=1;
	for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%mod;
	ifac[N-1]=qpow(fac[N-1],mod-2);
	for(int i=N-2;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
}*/
int a[N],n,m,ap[N],c[N],K,ty[N],X[4],ans[N],T,rt,dp[N],sum[N],lim[N],d[N],pos[N];
int plim[N];
int tsum[N];
int lowbit(int x){return x&(-x);}
string s[20];
signed main(){
	freopen("arena.in","r",stdin);
	freopen("arena.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>ap[i];
	for(int i=1;i<=m;i++) cin>>c[i];
	K=1;int tmp=2;
	while(tmp<n) tmp=tmp*2,K++;
	for(int i=1;i<=K;i++) cin>>s[i];
	int now=0;
	for(int i=K;i>=1;i--){
		for(int j=0;j<s[i].size();j++){
			now++;
			ty[now]=s[i][j]-'0';
		}
	}
	for(int i=(1<<K);i<(1<<K+1);i++) tsum[i]=i-(1<<K)+1;
	for(int i=(1<<K+1)-1;i>=2;i--) tsum[i>>1]+=tsum[i];
	lim[1]=0;d[1]=K;
	queue<int>q;q.push(1);
	while(!q.empty()){
		int u=q.front();q.pop();
		int l=(u<<1),r=(u<<1)|1;
		d[l]=d[r]=d[u]-1;
		if(l<(1<<K)) q.push(l),q.push(r);
	}
	for(int i=0;i<K;i++){
		int rt=(1<<i),rs=((rt<<1)|1);
		queue<int>q;while(!q.empty()) q.pop();
		if(ty[rt]==1) lim[rs]=d[rt];
		if(rs<(1<<K)) q.push(rs);
		while(!q.empty()){
			int u=q.front();q.pop();
			int l=(u<<1),r=(u<<1)|1;
			lim[l]=lim[r]=lim[u];
			if(!lim[u]){
				if(ty[u]==0) lim[l]=d[u];
				else lim[r]=d[u];
			}
			if(l<(1<<K)) q.push(l),q.push(r);
		}
	}
	cin>>T;
	while(T--){
		for(int i=0;i<4;i++) cin>>X[i];
		for(int i=1;i<=n;i++) a[i]=ap[i]^X[i%4],a[i]=min(a[i],17ll);
		for(int i=1;i<=n;i++) ans[i]=0;ans[1]=1;
		int all=0;
		for(int i=0;i<(1<<K+1);i++) dp[i]=(1<<18)-1,sum[i]=tsum[i];
		for(int i=K-1;i>=0;i--){
			//(1<<i) gen
			rt=(1<<i);int rs=(rt<<1)|1,ls=(rt<<1);
			int len=(1<<K-i-1);
			for(int j=0;j<len;j++)
				dp[(1<<K)+j]=a[j+1],pos[(1<<K)+j]=j+1;
			for(int j=K-1;j>i;j--){
				len=len/2;
				for(int k=0;k<len;k++){
					int po=(1<<j)+k;
					int l=(po<<1),r=(po<<1)|1;
					if(ty[po]==0){
						if(dp[l]>=d[po]) pos[po]=pos[l],dp[po]=dp[l];
						else pos[po]=pos[r],dp[po]=dp[r];
					}else{
						if(dp[r]>=d[po]) pos[po]=pos[r],dp[po]=dp[r];
						else pos[po]=pos[l],dp[po]=dp[l];
					}
				}
			}
			//if lim[x] = 0 or lim[x] > K-i no limit
			int tl=(1<<(K-i-1))+1,tr=(1<<K-i);tr=min(tr,n);
			if(ty[rt]==0&&dp[ls]>=d[rt]){
				for(int j=tl;j<=tr;j++) ans[j]=pos[ls];
				continue;
			}
			dp[ls]=(1<<dp[ls]);
			if(ty[rt]==1) sum[rt]=pos[ls]+sum[rs];
			else sum[rt]=sum[rs];
			for(int j=tl;j<=tr;j++){
				int now=(1<<K)+j-1;
				dp[now]=(1<<a[j]);
				int tmp=lim[now];
				if(a[j]<tmp) sum[now]=0;
				while(1){
					now>>=1;
					pii bef=mp(sum[now],dp[now]);
					int tmp=lim[now];
					//sum[now]
					int ls=(now<<1),rs=(now<<1)|1;
					if(ty[now]==0){
						sum[now]=sum[ls];
						if(lowbit(dp[ls])<(1<<d[now])) sum[now]+=sum[rs];
					}else{
						sum[now]=sum[rs];
						if(lowbit(dp[rs])<(1<<d[now])) sum[now]+=sum[ls];
					}
										if(now==rt) break;
					if(ty[now]==0){
						dp[now]=(dp[ls]|((1<<d[now])-1))^((1<<d[now])-1);
						if(lowbit(dp[ls])<(1<<d[now])) dp[now]|=dp[rs];
					}else{
						dp[now]=(dp[rs]|((1<<d[now])-1))^((1<<d[now])-1);
						if(lowbit(dp[rs])<(1<<d[now])) dp[now]|=dp[ls];
					}
				}
				ans[j]=sum[rt];
			}
		}
		int tot=0;//ans[16]=10;
		for(int i=1;i<=m;i++) tot=tot^(i*ans[c[i]]);
		cout<<tot<<endl;
	}
	return 0;
}